
pub fn string_new() {
    let mut ss = String::new();
    println!("ss: {:?}.", ss);

    let data = "initial contents";
    // 使用 to_string 方法从字符串字面值创建 String
    let sss = data.to_string();
    // 该方法也可直接用于字符串字面值：
    let s1 = "initial contents".to_string();

    println!("data: {:?}.", data);
    println!("sss: {:?}.", sss);
    println!("s1: {:?}.", s1);

    let sa= String::from("initial contents");
    println!("sa: {:?}.", sa);

    let hello = String::from("السلام عليكم");
    println!("hello: {:?}.", hello);
    let hello = String::from("Dobrý den");
    println!("hello: {:?}.", hello);
    let hello = String::from("Hello");
    println!("hello: {:?}.", hello);
    let hello = String::from("שָׁלוֹם");
    println!("hello: {:?}.", hello);
    let hello = String::from("नमस्ते");
    println!("hello: {:?}.", hello);
    let hello = String::from("こんにちは");
    println!("hello: {:?}.", hello);
    let hello = String::from("안녕하세요");
    println!("hello: {:?}.", hello);
    let hello = String::from("你好");
    println!("hello: {:?}.", hello);
    let hello = String::from("Olá");
    println!("hello: {:?}.", hello);
    let hello = String::from("Здравствуйте");
    println!("hello: {:?}.", hello);
    let hello = String::from("Hola");
    println!("hello: {:?}.", hello);

    updateStr();

    merageStr();

    // // 编译报错
    // let s1 = String::from("hello");
    // let h = s1[0];

    // 这里每一个字母的 UTF-8 编码都占用一个字节
    let hello = String::from("Hola");
    assert_eq!(hello.len(), 4);
    println!("hello size: {}.", hello.len());

    // 西里尔字母, 每个 Unicode 标量值需要两个字节存储。因此一个字符串字节值的索引并不总是对应一个有效的 Unicode 标量值。
    let hello1 = String::from("Здравствуйте");
    assert_eq!(hello1.len(), 24);
    println!("hello1 size: {}.", hello1.len());

    let hello = "Здравствуйте";
    let s = &hello[0..4];
    println!("s: {}.", s);

    // let hello = "Здравствуйте";
    // // 运行时错误
    // let s = &hello[0..1];
    // println!("s: {}.", s);

    for c in "नमस्ते".chars() {
        println!("遍历字符串的方法: {}", c);
    }
    let mut idx = 0;
    for b in "नमस्ते".bytes() {
        println!("bytes 方法返回[{}]每一个原始字节:{}", idx, b);
        idx += 1;
    }
}

fn updateStr(){
    // 使用 push_str 和 push 追加字符串
    let mut s = String::from("foo");
    // push_str 方法采用字符串 slice，因为我们并不需要获取参数的所有权
    s.push_str("bar");
    println!("updateStr: {:?}.", s);

    let mut s = String::from("lo");
    s.push('l');
    println!("updateStr: {:?}.", s);
}

// 将两个已知的字符串合并在一起
fn merageStr(){
    let s1 = String::from("Hello, ");
    let s2 = String::from("world!");
    // 使用 + 运算符将两个 String 值合并到一个新的 String 值中
    let s3 = s1 + &s2; // 注意 s1 被移动了，不能继续使用
    // println!("updateStr: {:?}.", s1);
    println!("merageStr: {:?}.", s2);
    println!("merageStr: {:?}.", s3);


    // 使用 push_str 和 push 追加字符串
    let mut s = String::from("Hello, ");
    // push_str 方法采用字符串 slice，因为我们并不需要获取参数的所有权
    s.push_str("world!");
    println!("merageStr: {:?}.", s);



    let s11 = String::from("tic");
    let s21 = String::from("tac");
    let s31 = String::from("toe");

    let sAll = s11 + "-" + &s21 + "-" + &s31;
    println!("merageStr sAll: {:?}.", sAll);

    let s11 = String::from("tic");
    let sAlla = format!("{}-{}-{}", s11, s21, s31);
    println!("merageStr sAlla: {:?}.", sAlla);

}